﻿using System.Collections.Generic;
using System.IO;
using System.Linq;

namespace FolderSynchronizer
{
	/// <summary>
	/// Класс, в котором реализуется метод проверки контрольных сумм на корректность.
	/// </summary>
	internal class HashChacker
	{
		private readonly List<FileInformation> listOfFileInRelease;
		private readonly DirectoryInfo tmpDir;
		private readonly FileInfo[] filesInTMP;
		private readonly List<FileInformation> filesForCopy;

		/// <summary>
		/// Конструктор. 
		/// </summary>
		/// <param name="checkSumFile">путь к файлу с информацией о файлах.</param>
		/// <param name="sourceFolder">Путь к исходной папке.</param>
		/// <param name="pathToTmp">путь к папке для проверки.</param>
		/// <param name="filesForCopy">Список файлов для копирования.</param>
		public HashChacker(string checkSumFile, string sourceFolder, string pathToTmp, List<FileInformation> filesForCopy)
		{
			listOfFileInRelease = checkSumFile != null ? ForXmlFiles.ReadXmlDocument(checkSumFile, sourceFolder) : new List<FileInformation>();
			tmpDir = new DirectoryInfo(pathToTmp);
			filesInTMP = tmpDir.GetFiles(".", SearchOption.AllDirectories);
			this.filesForCopy = filesForCopy;
		}

		/// <summary>
		/// Метод выполняющий проверку котрольных сумм на корректность.
		/// </summary>
		public void Check()
		{
			SeriesOfTests();
		}

		private void SeriesOfTests()
		{
			foreach (FileInformation fileInRelease in listOfFileInRelease)
			{
				FileInformation fileWithError = filesForCopy.Find(p => ((p.Hash != fileInRelease.Hash) && (p.FileInfo.Name == fileInRelease.FileInfo.Name)));
				if (filesInTMP.Where(fileInTmp => fileWithError != null).Any(fileInTmp => fileWithError.FileInfo.Name == fileInTmp.Name))
				{
					throw new SynchronizerException(fileWithError.FileInfo, SynchronizerException.ErrorType.ChackSumError);
				}
			}
		}
	}
}
